package com.tuling.learnjuc.base;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建和启动线程案例
 * TODO 观察源码，观察三种创建线程的方式
 */
@Slf4j
public class NewThread {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        // TODO 最常用newThread 直接new Thread
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "运行线程t1");
            }
        }, "t1");
        //启动线程
        t1.start();
        // 直接run是主线程在执行Thread.currentThread().getName()-》 main
//        t1.run();

        // TODO 方法2：通过Runnable创建线程
        // java8之后可以使用lambda表达式
        Runnable runnable = () -> System.out.println("运行线程t2");
        Thread thread = new Thread(runnable, "t2");
        thread.start();


        // 前两种即可，TODO 还可以使用FutureTask创建线程
        // TODO 观察FutureTask继承关系
        // ps：与前两种区别是可以拿到线程执行返回结果
        // 创建任务对象
        FutureTask<Integer> task3 = new FutureTask<>(() -> {
            log.debug("hello");
            return 100;
        });
        // 参数1 是任务对象; 参数2 是线程名字，推荐
        new Thread(task3, "t3").start();
        // 主线程阻塞，同步等待 task 执行完毕的结果
        Integer result = task3.get();
        log.debug("结果是:{}", result);

        // TODO Java生命周期看Thread下有一个枚举类State，有六种生命周期，操作系统层面有五种
    }
}
